package com.example.controller;

import cn.hutool.core.io.FileUtil; // 引入Hutool工具类，用于文件操作
import com.example.common.Result; // 引入自定义的Result类，用于封装响应结果
import jakarta.servlet.ServletOutputStream; // 引入ServletOutputStream，用于向客户端输出数据
import jakarta.servlet.http.HttpServletResponse; // 引入HttpServletResponse，用于设置HTTP响应
import org.springframework.beans.factory.annotation.Value; // 引入@Value注解，用于读取配置文件中的值
import org.springframework.web.bind.annotation.*; // 引入Spring MVC的注解
import org.springframework.web.multipart.MultipartFile; // 引入MultipartFile，用于处理文件上传

import java.io.IOException; // 引入IOException，处理输入输出异常
import java.net.URLEncoder; // 引入URLEncoder，用于URL编码
import java.nio.charset.StandardCharsets; // 引入StandardCharsets，用于指定字符集

/*
 * 文件相关操作接口
 * @RestController：表示这是一个控制器类，Spring会自动为其创建请求映射
 * @RequestMapping("/files")：定义该控制器处理请求的基础路径
 */
@RestController
@RequestMapping("/files")
public class FileController {

    // 表示本地磁盘文件的存储路径，使用系统当前工作目录加上"/files/"
    private static final String filePath = System.getProperty("user.dir") + "/files/";

    // 使用@Value注解读取配置文件中的fileBaseUrl属性，用于构建文件访问的URL
    @Value("${fileBaseUrl}")
    private String fileBaseUrl;

    /*
     * 文件上传接口
     * @PostMapping("/upload")：定义该接口处理POST请求，路径为"/upload"
     * @param file：接收上传的文件
     * @return：返回Result对象，包含操作结果和文件访问URL
     */
    @PostMapping("/upload")
    public Result upload(MultipartFile file) {
        // 定义文件的唯一标识，使用当前时间戳加上原始文件名
        String fileName = System.currentTimeMillis() + "-" + file.getOriginalFilename();
        // 拼接完整的文件存储路径
        String realFilePath = filePath + fileName;
        try {
            // 如果文件存储目录不存在，则创建
            if (!FileUtil.isDirectory(filePath)) {
                FileUtil.mkdir(filePath);
            }
            // 将文件内容写入到指定路径
            FileUtil.writeBytes(file.getBytes(), realFilePath);
        } catch (IOException e) {
            System.out.println("文件上传错误");
        }
        // 构建文件访问URL
        String url = fileBaseUrl + "/files/download/" + fileName;
        // 返回操作成功的结果和文件访问URL
        return Result.success(url);
    }

    /*
     * 文件下载接口
     * @GetMapping("/download/{fileName}")：定义该接口处理GET请求，路径为"/download/{fileName}"，其中{fileName}为路径变量
     * @param fileName：文件名称，从请求路径中获取
     * @param response：HTTP响应对象，用于设置响应头和输出文件内容
     */
    @GetMapping("/download/{fileName}")
    public void download(@PathVariable String fileName, HttpServletResponse response) {
        // 设置下载文件的响应头，指定文件名为URL编码后的fileName
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8));
        // 拼接完整的文件存储路径
        String realFilePath = filePath + fileName;
        try {
            // 读取文件内容到字节数组
            byte[] bytes = FileUtil.readBytes(realFilePath);
            // 获取Servlet输出流，用于向客户端输出数据
            ServletOutputStream os = response.getOutputStream();
            // 将文件字节数组写入到输出流，实现文件下载
            os.write(bytes);
            os.flush(); // 刷新输出流，确保数据被写出
            os.close(); // 关闭输出流，释放资源
        } catch (IOException e) {
            System.out.println("文件下载错误");
        }
    }

}